package com.example.reactive.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

@Configuration
public class CorsConfig {

    @Bean
    CorsWebFilter corsFilter() {

        CorsConfiguration config = new CorsConfiguration();
        // Possibly...
        // config.applyPermitDefaultValues()

        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

// Reactive Web 应用中，CORS 配置参考 Spring 官方文档： https://docs.springjava.cn/spring-framework/reference/web/webflux-cors.html

// Spring WebFlux 包含一个用于执行 HTTP 请求的客户端。WebClient 具有基于 Reactor 的功能性流畅 API（请参阅 “Reactive Libraries”），
// 可以声明式地组成异步逻辑，而无需处理线程或并发问题。它是完全无阻塞的，支持流式传输，并依赖于同样的编解码器，这些编解码器也用于对服务器端的请求和响应内容进行编码和解码。